from sqlalchemy import String
from sqlalchemy.orm import mapped_column, Mapped
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from learn_flask.extensions import db


class User(db.Model, UserMixin):
    """
    用户模型类，继承自db.Model和UserMixin
    
    db.Model: SQLAlchemy的基础模型类，提供数据库操作方法
    UserMixin: Flask-Login提供的混入类，包含用户认证所需的标准方法
    """
    # 数据库表名
    __tablename__ = 'user'
    
    # 字段定义，使用SQLAlchemy 2.0的新语法
    # 用户唯一标识
    id: Mapped[int] = mapped_column(primary_key=True)
    # 用户昵称
    name: Mapped[str] = mapped_column(String(20))
    # 用户名，用于登录
    username: Mapped[str] = mapped_column(String(20))
    # 密码哈希值，不直接存储明文密码
    password_hash: Mapped[str] = mapped_column(String(128))

    def set_password(self, password):
        """
        设置用户密码的哈希值
        
        Args:
            password (str): 明文密码
            
        使用Werkzeug的安全工具生成密码哈希，避免存储明文密码
        """
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """
        验证用户密码
        
        Args:
            password (str): 待验证的明文密码
            
        Returns:
            bool: 密码正确返回True，否则返回False
            
        使用Werkzeug的安全工具验证密码哈希
        """
        return check_password_hash(self.password_hash, password)


class Movie(db.Model):
    """
    电影模型类，继承自db.Model
    """
    # 数据库表名
    __tablename__ = 'movie'
    
    # 字段定义
    # 电影唯一标识
    id: Mapped[int] = mapped_column(primary_key=True)
    # 电影标题
    title: Mapped[str] = mapped_column(String(60))
    # 电影年份
    year: Mapped[str] = mapped_column(String(4))